package Test1;

/**
 * 验证器类，负责验证表达式的合法性
 */
public class Validator {

    /**
     * 验证表达式是否合法
     */
    public boolean isValid(Expression expr) {
        try {
            // 验证操作数范围
            if (!isNumberInRange(expr.getNum1()) || !isNumberInRange(expr.getNum2())) {
                return false;
            }

            if (expr.getNum3() != null && !isNumberInRange(expr.getNum3())) {
                return false;
            }

            // 验证除法除数不为零
            if ("÷".equals(expr.getOp1()) && expr.getNum2() == 0) {
                return false;
            }
            if (expr.getOp2() != null && "÷".equals(expr.getOp2()) && expr.getNum3() == 0) {
                return false;
            }

            // 验证结果范围
            if (!isResultInRange(expr.getResult())) {
                return false;
            }

            // 验证中间结果范围（三个数的情况）
            if (expr.getIntermediateResult() != null) {
                if (!isResultInRange(expr.getIntermediateResult())) {
                    return false;
                }
            }

            // 验证结果为正数
            if (expr.getResult() <= 0) {
                return false;
            }

            // 对于整数要求的情况，验证结果是否为整数
            if (!expr.isIntegerResult()) {
                return false;
            }

            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 验证数字是否在有效范围内 (0 < num < 100)
     */
    private boolean isNumberInRange(int num) {
        return num > 0 && num < 100;
    }

    /**
     * 验证结果是否在有效范围内 (0 < result < 100)
     */
    private boolean isResultInRange(double result) {
        return result > 0 && result < 100;
    }

    /**
     * 验证用户输入的数量是否合法
     */
    public boolean isValidCount(int count) {
        return count > 0 && count <= 1000;
    }

    /**
     * 验证类型选择是否合法
     */
    public boolean isValidType(int type) {
        return type >= 1 && type <= 8;
    }

    /**
     * 验证列数是否合法
     */
    public boolean isValidColumns(int columns) {
        return columns > 0 && columns <= 10;
    }
}